package com.zoctan.api.mapper;

import com.zoctan.api.dto.AccountWithRole;
import com.zoctan.api.dto.AccountWithRolePermission;
import com.zoctan.api.entity.Account;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author Zoctan
 * @date 2018/06/09
 */
@Mapper
@Repository
public interface AccountMapper {
  Account selectOne(Account account);
  
  default Account selectById(Long id) {
	  Account account = new Account();
	  account.setId(id);
	  return this.selectOne(account);
  }
  
  default Account selectByName(String name) {
	  Account account = new Account();
	  account.setName(name);
	  return this.selectOne(account);
  }
  
  default Account selectByEmail(String email) {
	  Account account = new Account();
	  account.setEmail(email);
	  return this.selectOne(account);
  }

  /**
   * 获取所有用户以及对应角色
   *
   * @return 用户列表
   */
  List<AccountWithRole> listAllWithRole();

  /**
   * 按微信小程序Id获取用户
   *
   * @return 用户
   */
  Account findByWechatOpenId(@Param("openId") String openId);

  /**
   * 按条件获取用户
   *
   * @param params 参数
   * @return 用户列表
   */
  List<AccountWithRole> findWithRoleBy(final Map<String, Object> params);

  /**
   * 按条件查询用户信息
   *
   * @param params 参数
   * @return 用户
   */
  AccountWithRolePermission findDetailBy(Map<String, Object> params);

  /**
   * 按用户名更新最后登陆时间
   *
   * @param name 用户名
   */
  void updateLoginTimeByName(@Param("name") String name, @Param("date") Date date);
  
  void updateSelectiveById(Account account);
  
  void deleteById(@Param("id") Long id);
  
  void insertSelective(Account account);
}
